//包含库文件
#include <ESP8266WiFi.h>
#include <espnow.h>
#include <MPU6050.h>
#include <Wire.h>


uint8_t broadcastAddress[] = {0xC4,0xD8,0xD5,0x00,0xF0,0xDE};


//定义了一个结构体struct_message来存储传感器采集到的加速度和角速度数据。
typedef struct {
    int16_t accelX;
    int16_t accelY;
    int16_t accelZ;
    int16_t gyroX;
    int16_t gyroY;
    int16_t gyroZ;
} SensorData;

//创建一个新的类型变量和mpu变量
SensorData sensorValues;
MPU6050 mpu;

//初始化ESPNow并注册发送回调函数OnDataSent
void onDataSentStatus(uint8_t *mac_addr, uint8_t status) {
    Serial.print("Data sent status: ");
    status == 0 ? Serial.println("Success") : Serial.println("Fail");
}

void setup() {
  //初始化串行监视器以进行调试
  Serial.begin(115200);
  Wire.begin();
  mpu.initialize();
  //将WiFi设置为STA模式
  WiFi.mode(WIFI_STA);

  //立即初始化ESP
  if (esp_now_init() != 0) {
    Serial.println("ESP-NOW init failed");
    return;
  }

  //将ESP8266设备设置为控制器角色，并添加配对的从设备ESP_NOW_ROLE_CONTROLLER， ESP_NOW_ROLE_SLAVE， 
  //ESP_NOW_ROLE_COMBO， ESP_NOW_ROLE_MAX。
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_register_send_cb(onDataSentStatus);
  
  //与另一个ESP8266设备配对以发送数据
  esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}

void loop() {
  //获取mpu传感器数值
  motionSensor.getMotion6(&sensorValues.accelX, &sensorValues.accelY, &sensorValues.accelZ,  &sensorValues.gyroX, &sensorValues.gyroY, &sensorValues.gyroZ);
  //发送消息
  esp_now_send(broadcastAddress, (uint8_t *) &sensorValues, sizeof(sensorValues));
  delay(500);
}